package array.stack;

import java.util.Stack;

/**
 * @ClassName EvalRPN
 * @Description TODO
 * @Author lenovo
 * @Date 2023-03-02 20:07
 * @Version 1.0
 * @Comment Magic. Do not touch.
 * If this comment is removed. the program will blow up
 */
public class EvalRPN {

    /**
     * 根据 逆波兰表示法，求表达式的值。
     * <p>
     * 有效的运算符包括 + ,  - ,  * ,  / 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。
     * <p>
     * 说明：
     * <p>
     * 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。
     * <p>
     * 示例 1：
     * <p>
     * 输入: ["2", "1", "+", "3", " * "]
     * 输出: 9
     * 解释: 该算式转化为常见的中缀算术表达式为：((2 + 1) * 3) = 9
     * 示例 2：
     * <p>
     * 输入: ["4", "13", "5", "/", "+"]
     * 输出: 6
     * 解释: 该算式转化为常见的中缀算术表达式为：(4 + (13 / 5)) = 6
     * 示例 3：
     * <p>
     * 输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]
     * <p>
     * 输出: 22
     * <p>
     * 解释:该算式转化为常见的中缀算术表达式为：
     */


    public int evalRPN(String[] tokens) {
        int result = 0;
        Stack<String> stack = new Stack<>();

        for (int i = 0; i < tokens.length; i++) {
            String token = tokens[i];

            if (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {
                String firstValue = stack.pop();
                String secondValue = stack.pop();
                Integer tempValue;
                if (token.equals("+")) {
                    tempValue = Integer.valueOf(secondValue) + Integer.valueOf(firstValue);
                } else if (token.equals("-")) {
                    tempValue = Integer.valueOf(secondValue) - Integer.valueOf(firstValue);
                } else if (token.equals("*")) {
                    tempValue = Integer.valueOf(secondValue) * Integer.valueOf(firstValue);
                } else {
                    tempValue = Integer.valueOf(secondValue) / Integer.valueOf(firstValue);
                }
                stack.push(String.valueOf(tempValue));
            } else {
                stack.push(token);
            }
        }

        return Integer.valueOf(stack.pop());
    }


    public static void main(String[] args) {
        EvalRPN evalRPN = new EvalRPN();
        System.out.println(evalRPN.evalRPN(new String[]{"10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"}));
    }
}